package cn.virens.common.boot.provider.auth;

import cn.virens.common.boot.dubbo.filter.attachment.AttachmentUtils;
import cn.virens.common.mybatis.entity.param.PageParam;
import cn.virens.common.mybatis.entity.param.PageParamUser;
import cn.virens.common.util.exception.APIException;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ObjUtil;

import java.util.Map;

public class AuthUtil {
    public static final String CTENANT = "T(cn.virens.common.boot.provider.auth.AuthUtil).key('_tenant_:' + #a0)";
    public static final String CDEPART = "T(cn.virens.common.boot.provider.auth.AuthUtil).key('_depart_:' + #a0)";

    public static final String CAREA = "T(cn.virens.common.boot.provider.auth.AuthUtil).key('_area_:' + #a0)";
    public static final String CROLE = "T(cn.virens.common.boot.provider.auth.AuthUtil).key('_role_:' + #a0)";
    public static final String CUSER = "T(cn.virens.common.boot.provider.auth.AuthUtil).key('_uuid_:' + #a0)";

    /**
     * 获取当前租户标识:优先参数
     */
    public static String likeTenant2(Map<String, Object> value) throws APIException {
        return likeTenant0(MapUtil.getStr(value, PageParamUser.K_TENANT, null));
    }

    /**
     * 获取当前租户标识:优先参数
     */
    public static String likeTenant1(PageParam param) throws APIException {
        return StrUtil.addSuffixIfNot(getTenant1(param), "%");
    }

    /**
     * 获取当前租户标识:优先参数
     */
    public static String likeTenant0(String value) throws APIException {
        return StrUtil.addSuffixIfNot(getTenant0(value), "%");
    }

    /**
     * 获取当前租户标识:优先参数
     */
    public static String likeTenant() throws APIException {
        return StrUtil.addSuffixIfNot(getTenant(), "%");
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String likeDepart2(Map<String, Object> value) throws APIException {
        return likeDepart0(MapUtil.getStr(value, PageParamUser.K_DEPART, null));
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String likeDepart1(PageParam param) throws APIException {
        return StrUtil.addSuffixIfNot(getDepart1(param), "%");
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String likeDepart0(String value) throws APIException {
        return StrUtil.addSuffixIfNot(getDepart0(value), "%");
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String likeDepart() throws APIException {
        return StrUtil.addSuffixIfNot(getDepart(), "%");
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String likeArea2(Map<String, Object> value) throws APIException {
        return likeArea0(MapUtil.getStr(value, PageParamUser.K_AREA, null));
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String likeArea1(PageParam param) throws APIException {
        return StrUtil.addSuffixIfNot(getArea1(param), "%");
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String likeArea0(String value) throws APIException {
        return StrUtil.addSuffixIfNot(getArea0(value), "%");
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String likeArea() throws APIException {
        return StrUtil.addSuffixIfNot(getArea(), "%");
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String likeRole2(Map<String, Object> value) throws APIException {
        return likeRole0(MapUtil.getStr(value, PageParamUser.K_ROLE, null));
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String likeRole1(PageParam param) throws APIException {
        return StrUtil.addSuffixIfNot(getRole1(param), "%");
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String likeRole0(String value) throws APIException {
        return StrUtil.addSuffixIfNot(getRole0(value), "%");
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String likeRole() throws APIException {
        return StrUtil.addSuffixIfNot(getRole(), "%");
    }

    /**
     * 获取当前租户标识:优先参数
     */
    public static String getTenant2(Map<String, Object> value) throws APIException {
        return MapUtil.getStr(value, PageParamUser.K_TENANT, getTenant());
    }

    /**
     * 获取当前租户标识:优先参数
     */
    public static String getTenant1(PageParam param) throws APIException {
        return param.getParam(PageParamUser.K_TENANT, getTenant());
    }

    /**
     * 获取当前租户标识:优先参数
     */
    public static String getTenant0(String value) throws APIException {
        return ObjUtil.defaultIfNull(value, getTenant());
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String getDepart2(Map<String, Object> value) throws APIException {
        return MapUtil.getStr(value, PageParamUser.K_DEPART, getDepart());
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String getDepart1(PageParam param) throws APIException {
        return param.getParam(PageParamUser.K_DEPART, getDepart());
    }

    /**
     * 获取当前部门标识:优先参数
     */
    public static String getDepart0(String value) throws APIException {
        return ObjUtil.defaultIfNull(value, getDepart());
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String getArea2(Map<String, Object> value) throws APIException {
        return MapUtil.getStr(value, PageParamUser.K_AREA, getArea());
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String getArea1(PageParam param) throws APIException {
        return param.getParam(PageParamUser.K_AREA, getArea());
    }

    /**
     * 获取当前区域标识:优先参数
     */
    public static String getArea0(String value) throws APIException {
        return ObjUtil.defaultIfNull(value, getArea());
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String getRole2(Map<String, Object> value) throws APIException {
        return MapUtil.getStr(value, PageParamUser.K_ROLE, getRole());
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String getRole1(PageParam param) throws APIException {
        return param.getParam(PageParamUser.K_ROLE, getRole());
    }

    /**
     * 获取当前角色标识:优先参数
     */
    public static String getRole0(String value) throws APIException {
        return ObjUtil.defaultIfNull(value, getRole());
    }

    /**
     * 获取当前用户标识:优先参数
     */
    public static String getUuid2(Map<String, Object> value) throws APIException {
        return MapUtil.getStr(value, PageParamUser.K_UUID, getUuid());
    }

    /**
     * 获取当前用户标识:优先参数
     */
    public static String getUuid1(PageParam param) throws APIException {
        return param.getParam(PageParamUser.K_UUID, getUuid());
    }

    /**
     * 获取当前用户标识:优先参数
     */
    public static String getUuid0(String value) throws APIException {
        return ObjUtil.defaultIfNull(value, getUuid());
    }

    /**
     * 获取当前调用用户信息-租户ID
     */
    public static String getTenant() throws APIException {
        return attrStr(PageParamUser.K_TENANT);
    }

    /**
     * 获取当前调用用户信息-部门ID
     */
    public static String getDepart() throws APIException {
        return attrStr(PageParamUser.K_DEPART);
    }

    /**
     * 获取当前调用用户信息-区域ID
     */
    public static String getArea() throws APIException {
        return attrStr(PageParamUser.K_AREA);
    }

    /**
     * 获取当前调用用户信息-角色ID
     */
    public static String getRole() throws APIException {
        return attrStr(PageParamUser.K_ROLE);
    }

    /**
     * 获取当前调用用户信息-UUID
     */
    public static String getUuid() throws APIException {
        return attrStr(PageParamUser.K_UUID);
    }

    /**
     * 处理缓存KEY（替换其中的关键词） <br>
     * 使用方式："T(cn.virens.util.AuthUtil).key(#a0)"
     */
    public static String key(String key) throws APIException {
        key = StrUtil.replace(key, "_tenant_", getTenant());
        key = StrUtil.replace(key, "_depart_", getDepart());
        key = StrUtil.replace(key, "_area_", getArea());
        key = StrUtil.replace(key, "_role_", getRole());
        key = StrUtil.replace(key, "_uuid_", getUuid());

        return key;
    }

    /**
     * 如果对应的值为全局配置值则返回null
     */
    private static String attrStr(String key) throws APIException {
        return AttachmentUtils.getAttachmentStr(key);
    }
}
